package exercises.leetcode;

import java.util.HashMap;

/**
 * <a href="https://leetcode-cn.com/problems/intersection-of-two-arrays-ii/">
 * 350. 两个数组的交集 II</a>
 *
 * <p>描述: 给定两个数组，编写一个函数来计算它们的交集。
 *
 * @author or2
 * @date 2021年09月21日 时间: 11:18
 */
public class No350 {
    public int[] intersect(int[] nums1, int[] nums2) {
        /*选择较小数组进行哈希映射, 节省内存空间*/
        if (nums1.length > nums2.length) {
            int[] num = nums1;
            nums1 = nums2;
            nums2 = num;
        }

        int[] ans = new int[nums1.length];

        HashMap<Integer, Integer> map = new HashMap<>(nums1.length);
        for (int num : nums1) {
            map.put(num, map.getOrDefault(num, 0) + 1);
        }
        int size = 0;
        for (int num : nums2) {
            Integer weight = map.getOrDefault(num, 0);
            if (weight != 0) {
                map.put(num, --weight);
                ans[size++] = num;
            }
        }

        if (nums1.length != size) {
            int[] temp = new int[size];
            System.arraycopy(ans, 0, temp, 0, temp.length);
            ans = temp;
        }
        return ans;
    }
}
